﻿Imports PTIC_GestionBDD
Imports PTIC_Util
Imports Actuariat

<Serializable()> Public Class UniversOMANE
    Inherits UniversBDD
    Implements IObservable

#Region "Variables de classe"

    'Les divers connections utilisées par l'univers OMANE
    'Connection vers la base de données contenant la table d'encours
    Protected _connectionEncours As OleDb.OleDbConnection
    'Connection vers le référentiel OMANE (au format SAS)
    Protected _connectionReferentielSAS As OleDb.OleDbConnection
    'Connection vers le fichier décrivant toutes les tables du référentiel
    Protected _connectionRefListeTbleRef As OleDb.OleDbConnection

    Protected _segmentation As Segmentation
    Protected _listeParametres As ParametresList
    Protected _numMethodeCalculEnCours As Integer
    Protected _lObserver As New List(Of IObserver)

#End Region

#Region "Création d'une instance"

    Public Sub New()
        MyBase.new()
        _BDDlocale = New DataSet()
        initInformat()
        initConnections()
        initListeTableReferentiel()
        initListeTraitements()
        initSegmentation()
        initListeParametres()
        numMethodeCalculEnCours = 2
    End Sub

    Private Sub initInformat()
        'Chargement des conversions de format possibles (disponibles au format XML)
        informatChampsBDD.MAJ_conversionsPossibles(csteEmplacementParametrage & "lstInformat.xml")
    End Sub
    Private Sub initConnections()
        'Récupération de la liste des tables de référentiel et stockage dans la base de données Locale
        'Création de la connection
        _connectionRefListeTbleRef = New OleDb.OleDbConnection( _
                "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & csteFichSynthReferentiel & ";" & _
                "Extended Properties=""Excel 8.0;HDR=YES;""")
        'Initialisation de l'espace de travail SAS
        SAS_initWorkspace()
        'Initialisation de la connection SAS vers le référentiel
        SAS_assigneLibName(csteEmplacementReferentiel, csteLibSASreferentiel)
        SAS_assigneLibName(csteEmplacementCalculsInt, csteLibSASCalculsInt)
    End Sub
    Private Sub initListeTableReferentiel()
        'Création du traitement permettant de récupérer la table
        Dim tbleListeTbleRef As New tableBDD_Excel("refListeTableRef", _
                                                   New Cla_NomFichier(csteFichSynthReferentiel), _
                                                   _connectionRefListeTbleRef)
        'Paramétrage du nom de la table
        tbleListeTbleRef.nomTableDansBDD = "refTables"
        'Exécution du traitement
        Dim tab As DataTable = tbleListeTbleRef.execute_DataTable(False)
        tab.TableName = "refListeTableRef"
        'Stockage du résultat dans la base de données locale
        _BDDlocale.Tables.Add(tab)
    End Sub
    Private Sub initListeTraitements()
        _collTraitements = New listeTraitementsOMANE(Me)
    End Sub
    Private Sub initSegmentation()
        segmentation = New Segmentation(Me)
    End Sub
    Private Sub initListeParametres()
        _listeParametres = New ParametresList()
    End Sub

#End Region

#Region "Propriétés"

    ''' <summary>
    ''' Objet gérant les variables de segmentation de l'étude
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Segmentation() As Segmentation
        Get
            Return _segmentation
        End Get
        Set(ByVal value As Segmentation)
            _segmentation = value
        End Set
    End Property
    ''' <summary>
    ''' Liste des paramètres de l'étude
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    ''' 
    Public ReadOnly Property ListeParametres()
        Get
            Return _listeParametres
        End Get
    End Property

    ''' <summary>
    ''' Numéro de la méthode de calcul du taux garanti en cours
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property numMethodeCalculEnCours() As Integer
        Get
            Return _numMethodeCalculEnCours
        End Get
        Set(ByVal value As Integer)
            _numMethodeCalculEnCours = value
            notifieChangement(Me, notification.numMethodeCalculAchange)
        End Set
    End Property
    Public ReadOnly Property refListeTablesReferentiel() As DataTable
        Get
            Return _BDDlocale.Tables("refListeTableRef")
        End Get
    End Property
    Public ReadOnly Property listeTraitements() As listeTraitementsOMANE
        Get
            Return _collTraitements
        End Get
    End Property

#End Region

#Region "Gestion des connections"

    Public Sub initLibrairieEncours(ByVal nomFichierConnection As Cla_NomFichier)
        SAS_assigneLibName(nomFichierConnection.nomRepertoire, csteLibSASEncours)
    End Sub

#End Region

#Region "Accesseurs aux dataTables du référentiel"

    Public Function getDataTableINCINVfra(ByVal csteNomTbleINCINVfra As String) As DataTable

        Dim result As DataTable
        If _BDDlocale.Tables.Contains("TBLEINCINVFRA") Then
            result = _BDDlocale.Tables("TBLEINCINVFRA")
        Else
            Dim traitTbleINCINVfra As TableBDD_SAS = New TableBDD_SAS("TBLEINCINVFRA", _
                                        New Cla_NomFichier(csteNomTbleINCINVfra), _
                                        _connectionSAS, csteLibSASreferentiel)
            result = traitTbleINCINVfra.execute_DataTable(False)

        End If
        Return result

    End Function
    Public Function getDataTableINCINVtaux(ByVal csteNomTbleINCINVtaux As String) As DataTable

        Dim result As DataTable
        If _BDDlocale.Tables.Contains("TBLEINCINVTAUX") Then
            result = _BDDlocale.Tables("TBLEINCINVTAUX")
        Else
            Dim traitTbleINCINVtaux As TableBDD_SAS = New TableBDD_SAS("TBLEINCINVTAUX", _
                                        New Cla_NomFichier(csteNomTbleINCINVtaux), _
                                        _connectionSAS, csteLibSASreferentiel)
            result = traitTbleINCINVtaux.execute_DataTable(False)

        End If
        Return result
    End Function
    Public Function getTableBDDReferentiel(ByVal nomDataTable As String, ByVal nomFichier As String) As tableBDD
        Dim d As New TableBDD_SAS(nomDataTable, _
                                  New Cla_NomFichier(csteEmplacementReferentiel & nomFichier), _
                                  _connectionSAS, _
                                  csteLibSASreferentiel)
        'La table n'est pas stockée en cache
        'Un mapping dépendant du type de table doit être appliqué et utilisé par la méthode execute_dataTable

        Return d
    End Function

#End Region

#Region "Gestion des relations de la base de données locale"

    Public Sub ParamRelationsV2(ByVal coll_Param As Hashtable, ByVal tableTravail As DataTable)

        Dim i As Integer
        'Tableau des noms des variables de segmentation du paramètre
        Dim coll_varSegParam As List(Of String)
        'Tableau des colonnes de la table de travail appartenant à la relation
        Dim tabCol_ExtSeg() As DataColumn
        'Tableau des colonnes de la segmentation du paramètre appartenant à la relation
        Dim tabCol_ExtParam() As DataColumn
        'Intégration de la table de travail au dataSet
        tableTravail.TableName = "TableTravail"
        _BDDlocale.Tables.Add(tableTravail)


        For Each param As IParamV2 In coll_Param.Values
            'Récupération de la segmentation du paramètre
            coll_varSegParam = param.getValeursSegments
            'Tableau des colonnes de la table de travail appartenant à la relation
            ReDim tabCol_ExtSeg(coll_varSegParam.Count - 1)
            'Tableau des colonnes de la segmentation du paramètre appartenant à la relation
            ReDim tabCol_ExtParam(coll_varSegParam.Count - 1)
            i = 0

            'Remplissage des tableaux de colonnes appartenant à la relation
            For Each s As String In coll_varSegParam
                'Dim nomSegment As String = getTraitEntreeModeleTxGar.mapSortie.listeCorrespondances(s).chOutil.Nom
                Dim nomSegment As String = s
                tabCol_ExtSeg(i) = _BDDlocale.Tables("TableTravail").Columns(nomSegment)
                tabCol_ExtParam(i) = param.getValeursDataTable.Columns(nomSegment)
                i = i + 1
            Next

            'Ajout d'une colonne dans la table extraction destinée à accueillir les valeurs du paramètre si elle n'existe pas déjà
            If Not _BDDlocale.Tables("TableTravail").Columns.Contains(param.nom) Then
                _BDDlocale.Tables("TableTravail").Columns.Add(param.nom, param.type)
            End If

            'Définition de la relation entre la table extraction et les valeurs du paramètre
            _BDDlocale.Relations.Add("relParam" & param.nom, tabCol_ExtSeg, tabCol_ExtParam, False)

        Next

    End Sub

    'Création des relations entre la table de travail (extraction des caractéristiques des segments
    'et les tables de segmentation des paramètres déclinés)
    Public Sub ParamRelations(ByVal coll_Param As Hashtable, ByRef tble As DataTable)

        Dim i As Integer
        'Tableau des noms des variables de segmentation du paramètre
        Dim coll_varSegParam As List(Of String)
        'Tableau des colonnes de la table de travail appartenant à la relation
        Dim tabCol_ExtSeg() As DataColumn
        'Tableau des colonnes de la segmentation du paramètre appartenant à la relation
        Dim tabCol_ExtParam() As DataColumn

        For Each param As IParamV2 In coll_Param.Values
            'Récupération de la segmentation du paramètre
            coll_varSegParam = param.getValeursSegments
            'Tableau des colonnes de la table de travail appartenant à la relation
            ReDim tabCol_ExtSeg(coll_varSegParam.Count - 1)
            'Tableau des colonnes de la segmentation du paramètre appartenant à la relation
            ReDim tabCol_ExtParam(coll_varSegParam.Count - 1)
            i = 0

            'Ajout dans le dataset de la table des valeurs du paramètre
            'If _BDDlocale.Tables.Contains("Extract" & param.nom) Then _BDDlocale.Tables.Remove("Extract" & param.nom)
            'param.valeurs.TableName = "Extract" & param.nom
            '_BDDlocale.Tables.Add(param.valeurs)

            'Remplissage des tableaux de colonnes appartenant à la relation
            For Each s As String In coll_varSegParam
                'Dim nomSegment As String = getTraitEntreeModeleTxGar.mapSortie.listeCorrespondances(s).chOutil.Nom
                Dim nomSegment As String = s
                Dim DT As DataTable = _BDDlocale.Tables("dtble_" & listeTraitements.getTraitEntreeModeleTxGar.nom)

                tabCol_ExtSeg(i) = _BDDlocale.Tables("dtble_" & listeTraitements.getTraitEntreeModeleTxGar.nom).Columns(nomSegment)
                tabCol_ExtParam(i) = param.getValeursDataTable.Columns(nomSegment)
                i = i + 1
            Next

            'Ajout d'une colonne dans la table extraction destinée à accueillir les valeurs du paramètre si elle n'existe pas déjà
            If Not _BDDlocale.Tables("dtble_" & listeTraitements.getTraitEntreeModeleTxGar.nom).Columns.Contains(param.nom) Then
                _BDDlocale.Tables("dtble_" & listeTraitements.getTraitEntreeModeleTxGar.nom).Columns.Add(param.nom, param.type)
            End If

            'Définition de la relation entre la table extraction et les valeurs du paramètre
            _BDDlocale.Relations.Add("relParam" & param.nom, tabCol_ExtSeg, tabCol_ExtParam, False)

        Next

    End Sub

    'Suppression des relations entre la table de travail (extraction des caractéristiques des segments
    'et les tables de segmentation des paramètres déclinés)
    Public Sub SupprParamRelations(ByVal coll_Param As Hashtable)
        For Each param As IParamV2 In coll_Param.Values
            _BDDlocale.Relations.Remove("relParam" & param.nom)
        Next
        If _BDDlocale.Tables.Contains("TableTravail") Then _BDDlocale.Tables.Remove("TableTravail")
    End Sub

#End Region

#Region "Gestion des observateurs"
    Public Function ajouteObserver(ByVal obs As IObserver) As Boolean Implements IObservable.ajouteObserver
        _lObserver.Add(obs)
    End Function
    Public Sub notifieChangement(ByVal sender As Object, ByVal notification As Object) Implements IObservable.notifieChangement
        For Each obs As IObserver In _lObserver
            obs.actualise(sender, notification)
        Next
    End Sub
    Public Function retireObserver(ByVal obs As IObserver) As Boolean Implements IObservable.retireObserver
        _lObserver.Remove(obs)
    End Function
#End Region

    Public Enum notification
        numMethodeCalculAchange
    End Enum

End Class


